const express = require('express');
const app = express();
const crypto = require('crypto');
const fs = require('fs');
const path = require('path');

// 添加中间件
app.use(express.json());
app.use(express.static(__dirname)); // 提供静态文件服务

// 存储长期 Token（模拟数据库）
const validAuthTokens = {
  'auth_token_123456': true, // 示例：长期 Token
};

// 模拟用户数据库
const users = {
  'admin': 'password123',
  'user1': '123456'
};

// 验证长期 Token 的中间件
function verifyAuthToken(req, res, next) {
  const authHeader = req.headers.authorization;
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return res.status(401).json({ error: '缺少身份认证 Token' });
  }

  const authToken = authHeader.split(' ')[1];
  if (!validAuthTokens[authToken]) {
    return res.status(401).json({ error: '无效的身份认证 Token' });
  }

  // 验证通过，继续处理
  next();
}

// 生成长期 Token
function generateAuthToken() {
  const token = 'auth_token_' + crypto.randomBytes(8).toString('hex');
  validAuthTokens[token] = true;
  console.log('生成的长期 Token:', token,validAuthTokens); // 打印生成的长期 Toke
  return token;
}

// 生成临时 Token
function generateTempToken() {
  const token = crypto.randomBytes(16).toString('hex'); // 32位随机字符串
  return {
    token,
    expiresAt: Date.now() + 10 * 60 * 1000, // 10分钟后过期
  };
}

// 存储临时 Token（实际生产应使用 Redis）
const tempTokenStore = {};

// 登录接口
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  
  if (!username || !password) {
    return res.status(400).json({ error: '用户名和密码不能为空' });
  }
  
  if (users[username] && users[username] === password) {
    const authToken = generateAuthToken();
    res.json({ 
      success: true, 
      authToken: authToken,
      message: '登录成功'
    });
  } else {
    res.status(401).json({ error: '用户名或密码错误' });
  }
});

// 获取临时 Token 的接口
app.get('/get-temp-token', verifyAuthToken, (req, res) => {
  const tempTokenData = generateTempToken();
  tempTokenStore[tempTokenData.token] = tempTokenData.expiresAt;

  // 返回临时 Token 给前端
  res.json({ tempToken: tempTokenData.token });
});

// 下载文件接口
app.get('/download', (req, res) => {
  const { tempToken } = req.query;

  // 验证临时 Token 是否存在且未过期
  if (!tempToken || !tempTokenStore[tempToken] || Date.now() > tempTokenStore[tempToken]) {
    return res.status(401).json({ error: '无效或过期的临时 Token' });
  }

  // 删除已使用的临时 Token
  delete tempTokenStore[tempToken];

  // 返回文件（示例：返回一个本地文件）
  const filePath = path.join(__dirname, 'example.txt');
  res.download(filePath, 'example.txt', (err) => {
    if (err) {
      res.status(500).json({ error: '文件下载失败' });
    }
  });
});

app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});